// const button = document.querySelector('.button')
// button.onclick = event => {
//   console.log('on click')
// }

// readile ('example.txt', (error, contents) => {
//   if (error) throw error
//   readile ('example2.txt', (error, contents) => {
//     if (error) throw error
//     readile ('example2.txt', (error, contents) => {
//       if (error) throw error
//       readile ('example2.txt', (error, contents) => {
//         if (error) throw error
//         readile ('example2.txt', (error, contents) => {
//           if (error) throw error
//           ...
//         })
//       })
//     })
//   })
// })

// const promise = readile ('example.txt')
// promise.then(contents => {
//   // 完成
// }, error => {
//   // 拒绝
// })
// promise.then(contents => {
//   // 完成
// })
// promise.then(null, error => {
//   // 拒绝
// })
// promise.catch(error => {
//   // 拒绝
// })
// promise.then(contents => {
//   // 完成
// }).catch(error => {
//   // 拒绝
// })

// const fs = require('fs')
// function readFile (fileName) {
//   return new Promise((resolve, reject) => {
//     // 触发异步操作
//     fs.readFile(fileName, { encoding: 'utf-8' }, (err, contents) => {
//       // 检查文件读取是否出错
//       if (err) {
//         reject(err)
//         return false
//       }
//       // 成功读取文件
//       resolve(contents)
//     })
//   })
// }
// const promise = readFile('example.txt')
// promise.then(contents => {
//   // 执行成功
// }).catch(error => {
//   // 拒绝执行
// })

// const promise = Promise.resolve(10)
// promise.then(value => console.log(value)) // 10

// const promise = Promise.reject(20)
// promise.catch(value => console.log(value)) // 20

// const thenable1 = {
//   then (resolve, reject) {
//     resolve(10)
//   }
// }
// const thenable2 = {
//   then (resolve, reject) {
//     reject(20)
//   }
// }
// const promise1 = Promise.resolve(thenable1)
// promise1.then(result => console.log(result)) // 10

// const promise2 = Promise.resolve(thenable2)
// promise2.catch(error => console.log(error)) // 20

// const promise = new Promise((resolve, reject) => {
//   throw new Error('Explosion!')
// })
// promise.catch(error => console.log(error)) // Error: Explosion!

// let rejected = null
// window.onunhandledrejection = event => {
//   console.log(event.type) // unhandledrejection
//   console.log(event.reason.message) // Explosion!
//   console.log(rejected === event.promise) // true
// }
// window.onrejectionhandled = event => {
//   console.log(event.type) // rejectionhandled
//   console.log(event.reason.message) // Explosion!
//   console.log(rejected === event.promise) // true
// }

// rejected = Promise.reject(new Error('Explosion!'))

// const p1 = new Promise((resolve, reject) => {
//   resolve(10)
// })
// p1.then(result => console.log(result)).then(() => console.log('finished'))
// const p1 = new Promise((resolve, reject) => {
//   resolve(10)
// })
// p1.then(result => {
//   throw new Error('Pa!Pa!Pa!')
// }).catch(error => {
//   console.log(error.message) // Pa!Pa!Pa!
//   throw new Error('Explosion!')
// }).catch(error => {
//   console.log(error.message) // Explosion!
// })

// const p1 = new Promise((resolve, reject) => {
//   resolve(10)
// })
// const p2 = new Promise((resolve, reject) => {
//   reject(20)
// })
// p1.then(res => {
//   console.log(res) // 10
//   return p2
// }).catch(error => {
//   console.log(error) // 20
// })

// const p1 = new Promise((resolve, reject) => {
//   setTimeout(() => {
//     resolve(10)
//   }, 5000)
// })
// p1.then(res => {
//   console.log(res) // 5秒后返回10
//   const p2 = new Promise((resolve, reject) => {
//     setTimeout(() => {
//       resolve(20)
//     }, 2000)
//   })
//   return p2
// }).then(res => {
//   console.log(res) // 第一个执行完后的2秒后才会返回20
// })

// const p1 = new Promise((resolve, reject) => {
//   setTimeout(() => {
//     reject(10)
//   }, 1000)
// })
// const p2 = new Promise((resolve, reject) => {
//   setTimeout(() => {
//     resolve(20)
//   }, 3000)
// })
// const p3 = Promise.race([p1, p2])
// p3.then(res => {
//   console.log(res) // 不会被执行
// }).catch(error => {
//   console.log(error) // 10
// })

class MyProise extends Promise {
  success (resolve, reject) {
    return this.then(resolve, reject)
  }
  failure (reject) {
    return this.catch(reject)
  }
}

const promise = new MyProise((resolve, reject) => {
  resolve(10)
})
promise.success(res => {
  console.log(res) // 10
}).failure(error => {
  console.log(error)
})

